
package br.com.dbsti.construtortelas;

import br.com.dbsti.construtortelas.anotacoes.Label;
import br.com.dbsti.construtortelas.anotacoes.Layout;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import org.apache.commons.beanutils.PropertyUtils;


public class EditorObjetosAutomatico<Tipo> extends EditorObjetos<Tipo> {

    Class classe;
    Map<String, JComponent> editores = new LinkedHashMap<String, JComponent>();
    
    public EditorObjetosAutomatico(Class classe) {
        this.classe = classe;
    }
    
    @Override
    protected void preencheCamposTela() {
        for(String nomeAtributo : editores.keySet()){
            JTextField txt = (JTextField) editores.get(nomeAtributo);
            try{
                txt.setText(PropertyUtils.getProperty(this.valor, nomeAtributo).toString());
            } catch (Exception ex) {
                ex.printStackTrace();
            }            
        }   
    }

    @Override
    protected void lerCamposTela() {
        for(String nomeAtributo : editores.keySet()){
            JTextField txt = (JTextField) editores.get(nomeAtributo);
            try{
              Class type = PropertyUtils.getPropertyType(this.valor, nomeAtributo);
                if (type.equals(Long.class)){
                    PropertyUtils.setProperty(this.valor, nomeAtributo, Long.valueOf(txt.getText()));
                } else {
                    PropertyUtils.setProperty(this.valor, nomeAtributo, txt.getText());
                }
                    
            } catch (Exception ex) {
                ex.printStackTrace();
            }            
        }
    }

    @Override
    protected void adicionarEditoresPropriedades() {
        int linha = 0;
        for (Field atributo : this.classe.getDeclaredFields()){
            String label = atributo.getName();
           
            //busco as anotações de label caso exista anotações
            if(atributo.isAnnotationPresent(Label.class)){
                Label anotacao = atributo.getAnnotation(Label.class);
                label = anotacao.value();
            }
             this.add(new JLabel(String.format("%s:", label)), 
                     String.format("cell 0 %s", linha));
            JTextField txt = new JTextField();
            this.editores.put(atributo.getName(), txt);
            
            String width = "w 100px!";
            if(atributo.isAnnotationPresent(Layout.class)){
                Layout layout = atributo.getAnnotation(Layout.class);
                width = layout.width();
            }                   
            this.add(txt,String.format("cell 1 %s, %s",linha, width));
             linha++;
        }
    }
    
}
